﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace RecursosHumanos
{
    public partial class frmPerfil_ : Form
    {
        Request request;

        WBGEntities bd = new WBGEntities();
        public Perfil perfil;

        public frmPerfil_(Request req)
        {
            //if (req != Request.Inserir)
            //    throw new Exception("Sem parâmetros para realizar a alteração/visualização.");

            request = req;
            InitializeComponent();
        }

        private void frmPessoa_Load(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            if (request == Request.Inserir)
            {
                PreparaInsert();
            }
            else
            {
                CarregaCampos();
            }

            CarregaBrowses();

            Cursor.Current = Cursors.Default;
        }

        private void CarregaBrowses()
        {
            if (!frmMenu.VerificarDiretiva(9)) //Usuários
            {
                GBotoesUsu.Enabled = false;
            }
            else
            {
                grdUsuarios.DataSource = from x in bd.Usuario
                                         select new { x.idUsuario, Usuário = x.nome, x.Pessoa.nome };

                grdUsuarios.Columns[0].Visible = false; // HeaderText = "ID";
                grdUsuarios.Columns[1].HeaderText = "Usuário";
                grdUsuarios.Columns[2].HeaderText = "Nome";
            }

            if (!frmMenu.VerificarDiretiva(2)) //Diretivas
            {
                GBotoesUsu.Enabled = false;
            }
            else
            {
                grdDiretivas.DataSource = from x in bd.Diretiva
                                          select new { x.idDiretiva, x.nome };

                grdDiretivas.Columns[0].Visible = false; // HeaderText = "ID";
                grdDiretivas.Columns[1].HeaderText = "Nome";
            }

            AtualizaUsuarios();

            grdUsu.Columns[0].Visible = false; // HeaderText = "ID";
            grdUsu.Columns[1].HeaderText = "Usuário";
            grdUsu.Columns[2].HeaderText = "Nome";

            AtualizaDiretivas();

            grdDir.Columns[0].Visible = false; // HeaderText = "ID";
            grdDir.Columns[1].HeaderText = "Nome";
        }

        private void AtualizaDiretivas()
        {
            grdDir.DataSource = from x in bd.PerfilDiretiva
                                select new { x.idDiretiva, x.Diretiva.nome };
        }

        private void AtualizaUsuarios()
        {
            grdUsu.DataSource = from x in bd.PerfilUsuario
                                select new { x.idUsuario, Usuário = x.Usuario.nome, x.Usuario.Pessoa.nome };
        }

        private void PreparaInsert()
        {
            if (perfil == null)
                perfil = new Perfil();
        }

        private void CarregaCampos()
        {
            txtID.Text = perfil.idPerfil.ToString();
            txtNome.Text = perfil.nome;
            chkAtivo.Checked = perfil.ativo;
        }

        private void CarregaRegistro()
        {
            try
            {
                perfil.nome = txtNome.Text;
            }
            catch
            {
                throw new Exception("Há dados inválidos.");
            }
        }

        private void frmLocacao__KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F5)
            {
                try
                {
                    CarregaRegistro();
                    if (request == Request.Inserir)
                    {
                        bd.Perfil.AddObject(perfil);
                    }
                    else
                    {

                    }
                    bd.SaveChanges();
                    MessageBox.Show("Registro gravado com sucesso.", "Concluído", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    this.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.InnerException.Message,"Erro",MessageBoxButtons.OK,MessageBoxIcon.Error);
                }
            }
        }

        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (tabControl1.SelectedIndex)
            {
                case 1:
                    if (!GBotoesUsu.Enabled)
                        MessageBox.Show("Você não possui permissão para alterar essa seção.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case 2:
                    if (!GBotoesDir.Enabled)
                        MessageBox.Show("Você não possui permissão para alterar essa seção.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                PerfilUsuario pu = new PerfilUsuario();
                pu.idPerfil = perfil.idPerfil;
                pu.idUsuario = Convert.ToInt32(grdUsuarios.CurrentRow.Cells["idUsuario"].Value);
                bd.PerfilUsuario.AddObject(pu);
                bd.SaveChanges();
                AtualizaUsuarios();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao adicionar", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            var lst = bd.PerfilUsuario.Where(x => x.idUsuario == perfil.idPerfil);
            foreach (var item in lst)
                bd.PerfilUsuario.DeleteObject(item);
            bd.SaveChanges();
            AtualizaUsuarios();
        }

        private void button6_Click(object sender, EventArgs e)
        {
            var lst = bd.PerfilDiretiva.Where(x => x.idPerfil == perfil.idPerfil);
            foreach (var item in lst)
                bd.PerfilDiretiva.DeleteObject(item);
            bd.SaveChanges();
            AtualizaDiretivas();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                PerfilDiretiva pd = new PerfilDiretiva();
                pd.idPerfil = perfil.idPerfil;
                pd.idDiretiva = Convert.ToInt32(grdDiretivas.CurrentRow.Cells["idDiretiva"].Value);
                bd.PerfilDiretiva.AddObject(pd);
                bd.SaveChanges();
                AtualizaDiretivas();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao adicionar", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("Deseja realmente excluir?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No)
                    return;

                int id = Convert.ToInt32(grdDir.CurrentRow.Cells["idDiretiva"].Value);
                var reg = bd.PerfilDiretiva.FirstOrDefault(x => x.idDiretiva == id && x.idPerfil == perfil.idPerfil);
                bd.DeleteObject(reg);
                bd.SaveChanges();
                AtualizaDiretivas();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao excluir", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            try
            {
                //bd.ProcAddAllPoliciesPerfil(perfil.idPerfil);
                bd.SaveChanges();
                AtualizaUsuarios();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao adicionar", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("Deseja realmente excluir?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No)
                    return;

                int id = Convert.ToInt32(grdUsu.CurrentRow.Cells["idUsuario"].Value);
                var reg = bd.PerfilUsuario.FirstOrDefault(x => x.idUsuario == id && x.idPerfil == perfil.idPerfil);
                bd.DeleteObject(reg);
                bd.SaveChanges();
                AtualizaUsuarios();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao excluir", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                //bd.ProcAddAllUsersPerfil(perfil.idPerfil);
                bd.SaveChanges();
                AtualizaUsuarios();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "Erro ao adicionar", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
